package com.klun.project.common.constans.leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。
// 返回这三个数的和。
// 假定每组输入只存在恰好一个解。
// 示例 1：
//输入：nums = [-1,2,1,-4], target = 1
//输出：2
//解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
// 示例 2：
//输入：nums = [0,0,0], target = 1
//输出：0
// 提示：
// 3 <= nums.length <= 1000
// -1000 <= nums[i] <= 1000
// -104 <= target <= 104
// Related Topics 数组 双指针 排序
// 👍 1285 👎 0

public class Solution16 {

	public int threeSumClosest(int[] nums, int target) {
		int len = nums.length;
		if (len < 3) return 0;
		int ans = Integer.MAX_VALUE;
		Arrays.sort(nums);
		int index = len - 1;
		for (int i = 0; i < len; i++) {
			for (int j = i + 1; j < len; j++) {
				if (index <= j) return ans;
				int sum = nums[i] + nums[j];
				while (sum + nums[index] > target && index > j + 1) {
					--index;
				}
				ans = Math.min(Math.min(Math.abs(target - sum - nums[index]), Math.abs(target - sum - nums[index + 1])), ans);
			}
		}
		return ans;
	}

	public static void main(String[] args) {
		Solution16 solution = new Solution16();
		System.out.println(solution.threeSumClosest(new int[]{9, 9, 9, 8}, 9));
	}


}
